﻿using System.Security.Cryptography;
using System.Text;

namespace ETask.Api.Data
{
    public class Md5Helper
    {
        /// <summary>
        /// 对字符串进行MD5加密，返回32位小写结果
        /// </summary>
        /// <param name="input">需要加密的字符串</param>
        /// <returns>32位小写MD5哈希值</returns>
        public static string Encrypt32(string input)
        {
            if (string.IsNullOrEmpty(input))
                throw new ArgumentNullException(nameof(input), "输入字符串不能为空");

            // 创建MD5实例
            using (var md5 = MD5.Create())
            {
                // 将字符串转换为字节数组（使用UTF8编码）
                byte[] inputBytes = Encoding.UTF8.GetBytes(input);

                // 计算MD5哈希值
                byte[] hashBytes = md5.ComputeHash(inputBytes);

                // 将字节数组转换为32位十六进制字符串
                var sb = new StringBuilder();
                foreach (byte b in hashBytes)
                {
                    // 格式化为两位十六进制，不足两位前面补0
                    sb.Append(b.ToString("x2"));
                }
                return sb.ToString();
            }
        }

        /// <summary>
        /// 对字符串进行MD5加密，返回16位小写结果
        /// 16位结果是32位结果的中间16位
        /// </summary>
        /// <param name="input">需要加密的字符串</param>
        /// <returns>16位小写MD5哈希值</returns>
        public static string Encrypt16(string input)
        {
            // 16位MD5是32位MD5的第8位到第24位
            return Encrypt32(input).Substring(8, 16);
        }

        /// <summary>
        /// 对字节数组进行MD5加密
        /// </summary>
        /// <param name="data">需要加密的字节数组</param>
        /// <returns>32位小写MD5哈希值</returns>
        public static string Encrypt(byte[] data)
        {
            if (data == null || data.Length == 0)
                throw new ArgumentNullException(nameof(data), "输入字节数组不能为空");

            using (var md5 = MD5.Create())
            {
                byte[] hashBytes = md5.ComputeHash(data);

                var sb = new StringBuilder();
                foreach (byte b in hashBytes)
                {
                    sb.Append(b.ToString("x2"));
                }
                return sb.ToString();
            }
        }

        /// <summary>
        /// 验证字符串与MD5哈希值是否匹配
        /// </summary>
        /// <param name="input">原始字符串</param>
        /// <param name="md5Hash">MD5哈希值</param>
        /// <returns>是否匹配</returns>
        public static bool Verify(string input, string md5Hash)
        {
            if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(md5Hash))
                return false;

            // 计算输入字符串的MD5值
            string inputHash = Encrypt32(input);

            // 比较两个哈希值（忽略大小写）
            return string.Equals(inputHash, md5Hash, StringComparison.OrdinalIgnoreCase);
        }
    }
}
